Java 中的数字提升和降级如何用于文字和变量?

How numeric promotion and demotion works for literals and variables in Java?

我不确定我的问题是否足够清楚,所以我将举例说明。假设我们有下一个表达式:

byte byteNumber = 10 * 10;

我知道字面数字 10 默认是一个整数,所以表达式 10 * 10 也会产生一个整数,但是 Java 将它“降级”为一个字节值,因为变量(存储结果的地方)是一个字节。

但是,为什么这会有所不同?

int x = 10;
int y = 10;

byte byteNumber = x * y;

行字节 byteNumber = x * y; 被标记为错误。我理解表达式 x * y 会产生一个整数,但不会像文字那样“降级”。即使只有一个变量,如 x * 10,结果也不会降级。为什么呢?我相信它与变量类型有关,但默认情况下文字是整数,它们可以“降级”。

我正在努力的另一个例子是:我们可以将整数文字分配给 byte、short 或 char 类型的变量,并且 Java 会自动将整数转换为我们声明的变量类型,例如:

short a = 10;
byte b = 12;

另一方面,为什么我们不能做这样的事情呢?

float c = 12.0;

是的,12.0 是一个双精度数,但为什么不能将它“降级”为浮点数并强制我们将字面量声明为浮点数 12.0F?我知道这将代表信息丢失。但是,将整数转换为短整型或字节也代表信息丢失,不是吗?

最后,为什么我们可以将整型字面量赋值给 short 或 byte 类型的变量...

 short a = 10;
 byte b = 12;

但是我们不能将整数作为参数传递给需要 short/byte 参数的方法?

public void newMethod(short x, byte y){
    ...
}

。 . .

newMethod(10, 2)

如果你能搜索一些我可以阅读此类内容的链接,那就太好了(因为我不太确定如何搜索我遇​​到的这些具体问题)。

提前谢谢大家。

您可以查看以下两个链接:

顺便说一句,这两个问题都由 #1 Whosebug 贡献者 Jon Skeet 回答了:)